1장. 단어를 숫자로 — 선형대수

출처: 『AI 엔지니어링 선수지식』(youtubedu 자체 제작 학습노트) | 입문판 재구성 — 노트가 1차 소스(PDF 원본 없음)

코드는 분위기만 — numpy·import 같은 말은 몰라도 됩니다. 비유와 직접 해보기 숫자만 따라와도 충분해요.


0. 이 장의 새 단어 (0장에 없는 것만 3개)

0장 용어집에 이미 있는 말(벡터·행렬·차원·임베딩·내적·코사인 유사도)은 다시 설명하지 않아요.

이 장에서 처음 나오는 말은 딱 3개입니다.


길이(norm, 노름)

한 문장 뜻 — 벡터라는 화살표가 얼마나 긴가를 나타내는 하나의 숫자.

일상비유 — 자로 잰 화살표의 길이. 방향은 빼고 "얼마나 멀리 가나"만 본다.

한 줄 예 —

# [3, 4] 의 길이 = 5 (각 숫자 제곱해 더한 뒤 루트)
length = (3**2 + 4**2) ** 0.5   # 5.0

행렬 곱(matrix multiplication)

한 문장 뜻 — 표(행렬)와 표를 곱해 새로운 표로 바꾸는 연산. 내적을 칸마다 여러 번 한 것.

일상비유 — 입력을 넣으면 모양이 바뀌어 나오는 변환 기계. 기계는 고정, 재료만 바꿔 넣는다.

한 줄 예 —

# 표 A 와 표 B 를 곱하면 새 표가 나온다
result = A @ B   # @ 가 곱하기 기호

고유벡터·고유값(eigenvector·eigenvalue)

한 문장 뜻 — 어떤 변환을 해도 방향이 안 바뀌는 특별한 화살표가 고유벡터, 그때 늘어난 배율이 고유값.

일상비유 — 빙글 도는 지구본의 남극–북극 축. 다른 점은 다 도는데 이 축만 자리를 안 바꾼다.

한 줄 예 —

# [[2,0],[0,3]] 을 [1,0] 에 곱하면 [2,0]. 방향 그대로, 길이만 2배
# → [1,0] 이 고유벡터, 2 가 고유값

(귀납 도입) 이런 적 있죠?

컴퓨터에게 "강아지" 라고 쳤더니 받아먹질 못합니다.

당연해요. 컴퓨터는 글자를 모릅니다. 숫자만 알아요.

그러면 단어를 숫자로 바꿔야 하는데, 숫자 하나로는 부족합니다.

"강아지" 한 단어에도 뜻이 여러 갈래라서, 숫자 한 개로는 다 담기지 않아요.

그래서 숫자를 여러 개 한 줄로 묶습니다. 이 묶음이 벡터예요.

그리고 이 묶음들을 다루고, 쌓고, 비교하고, 변환하는 모든 계산이 선형대수입니다.

한 장면으로 — LLM 이 "강아지" 를 알아듣는 첫걸음은, 그 단어를 수백 개의 숫자 묶음으로 바꾸는 일이에요.

이 장은 그 숫자 묶음을 다루는 6가지 도구를 하나씩 풀어 봅니다.


이 장에서 딱 6가지만

  1. 벡터 — 단어 하나를 숫자 묶음으로 적은 것. (화살표 = 방향 + 크기)
  2. 행렬 — 그 벡터를 여러 줄 쌓은 숫자 표. (엑셀 시트)
  3. 내적 — 두 벡터가 얼마나 같은 방향인지를 숫자 하나로 잰 점수.
  4. 코사인 유사도 — 크기는 빼고 방향(각도)만으로 비슷함을 잰 값.
  5. 행렬 곱 — 표를 표로 바꾸는 변환. 신경망의 모든 층이 이거.
  6. 고유값·고유벡터 — 변환해도 방향이 안 바뀌는 특별한 화살표.

한 줄 요약 — LLM 은 글자를 벡터로 바꾸고, 행렬 곱으로 섞고, 내적으로 서로 주목하게 만드는 거대한 선형대수 계산기예요.


1. 벡터 — 숫자 묶음

막히는 장면

친구 한 명을 컴퓨터에게 소개하고 싶어요.

"키 크고 마른 편" 이라고 적으면 컴퓨터는 못 알아듣습니다.

대신 [키 172, 몸무게 65, 시력 1.2] 처럼 숫자로 적으면, 컴퓨터가 받아먹어요.

이 숫자 묶음 한 장이 바로 그 친구의 벡터입니다.

비유 먼저 — 화살표

"북동쪽으로 5km" 라는 말에는 방향(북동)과 크기(5km)가 같이 들어 있어요.

벡터가 정확히 이래요. [3, 4] 는 오른쪽으로 3, 위로 4 간 화살표입니다.

비유 코드 위험
북동쪽으로 5km (방향+크기) v = [3, 4] 숫자로 안 바꾸면 컴퓨터가 못 읽음
친구 정보 카드 (항목별 숫자) friend = [172, 65, 1.2] 차원(숫자 개수)이 안 맞으면 비교가 막힘

한 문장 정의 — 벡터는 여러 숫자를 순서대로 묶은 묶음이며, 방향과 크기를 함께 담는다.

예시 폭격

예시 1 (완성예 — 길이 구하기) — [3, 4] 의 길이는 각 숫자를 제곱해 더하고(3²+4²=25) 루트를 씌워 √25 = 5 입니다. (피타고라스 정리)

예시 2 (부분완성 — 빈칸) — [6, 8] 의 길이는? 6²+8² = 36+64 = 100, 루트 씌우면 √100 = ___ 입니다. (답: 10. 방향은 [3,4] 와 같고 길이만 2배예요.)

예시 3 (독립적용 — 실생활) — 넷플릭스는 사용자를 [액션 80, 로맨스 30, 코미디 50], 영화를 [액션 90, 로맨스 5, 코미디 20] 으로 저장해요. 두 벡터의 방향이 비슷하면 그 영화를 추천합니다.

import numpy as np
v = np.array([3, 4])
print(np.linalg.norm(v))      # 5.0  (길이)
print(v / np.linalg.norm(v))  # [0.6 0.8]  (길이를 1로 맞춘 화살표)
 y
 4 |        ● (3,4)
 3 |       /:
   |      / :   ← 길이 = √(3²+4²) = 5
 0 +----+---+--- x
   0    3

미니 시나리오 — 쿠팡·유튜브·스포티파이의 "추천" 은 전부 사용자와 상품을 벡터로 저장해 두고, 방향이 가까운 것을 찾는 일이에요. LLM 은 한 발 더 나아가 "강아지" 같은 단어를 수백~수천 개 숫자 묶음(임베딩)으로 바꿔, 뜻이 비슷한 단어를 가까이 모아 둡니다.


2. 행렬 — 숫자 표

막히는 장면

친구 한 명은 벡터 한 줄로 적었어요.

그런데 반 학생 30명을 한꺼번에 다루려면?

벡터 30개를 위아래로 쌓으면 됩니다. 이렇게 쌓인 숫자 표가 행렬이에요.

비유 먼저 — 엑셀 시트

학생 30명의 [국어, 영어, 수학] 점수를 적으면 30줄 × 3칸 표가 됩니다.

한 줄(행)이 한 학생의 점수 벡터예요. 행렬은 곧 벡터의 묶음입니다.

비유 코드 위험
엑셀 시트 (행 × 열) M = [[90, 85, 100], [70, 95, 80]] 행과 열을 헷갈리면 엉뚱한 칸을 읽음
흑백 사진 (칸마다 밝기) 사진 = 1080행 × 1920열 모양(shape)을 잘못 읽으면 계산이 막힘

한 문장 정의 — 행렬은 벡터를 여러 줄 쌓아 만든 숫자 표(행 × 열 격자)다.

예시 폭격

예시 1 (완성예 — 모양 읽기) — [[90, 85, 100], [70, 95, 80]] 은 줄(행)이 2개, 칸(열)이 3개라서 모양은 (2, 3) 입니다. "2명 × 3과목" 이라는 뜻이에요.

예시 2 (부분완성 — 빈칸) — [[1, 2], [3, 4], [5, 6]] 의 모양은? 줄이 3개, 칸이 2개니까 (, ) 입니다. (답: (3, 2))

예시 3 (독립적용 — 좌석표) — 영화관 좌석을 행(A~J) × 열(1~20) 표로 만들고 예매=1·빈자리=0 을 채우면, "몇 자리 남았나" 는 0 의 개수가 됩니다.

M = np.array([[90, 85, 100], [70, 95, 80]])
print(M.shape)      # (2, 3)   ← 2줄 3칸
print(M[:, 2])      # [100  80] ← 수학 점수 열만 뽑기

미니 시나리오 — 이미지(픽셀 표)·표 데이터·문장(단어 벡터 쌓기)이 전부 행렬이에요. 문장 "나는 학교에 간다" 는 단어 4개 × 768칸 = 4×768 행렬이 됩니다. 그리고 모델 안의 가중치도 전부 거대한 행렬이에요.


3. 내적 — 같은 방향 점수

막히는 장면

벡터 두 개가 있어요. 이 둘이 얼마나 비슷한지 숫자 하나로 알고 싶습니다.

그냥 눈으로 보면 헷갈려요. 객관적인 점수가 필요해요.

같은 자리끼리 곱해 다 더하면, 방향이 비슷할수록 큰 숫자가 나옵니다. 이게 내적이에요.

비유 먼저 — 취향 궁합

[액션5, 로맨스1, 코미디4] 와 친구 [액션4, 로맨스2, 코미디5].

둘 다 액션·코미디가 높아서, 같은 자리끼리 곱한 값이 커져요 = 궁합이 좋다는 뜻입니다.

비유 코드 위험
취향 궁합 점수 np.dot(a, b) 값이 클수록 같은 방향, 0 이면 직각(무관)
손전등과 벽 a @ b (@ 도 내적) 차원 수가 다르면 곱할 수가 없음

손전등을 벽에 정면으로 비추면 밝고(내적 큼), 비스듬하면 어둡고(작음), 90도 옆이면 안 닿아요(내적 0).

한 문장 정의 — 내적은 두 벡터를 같은 자리끼리 곱해 모두 더한 하나의 숫자이며, 두 벡터가 얼마나 같은 방향인가를 나타낸다.

예시 폭격

예시 1 (완성예) — [5, 1, 4] · [4, 2, 5] = (5×4)+(1×2)+(4×5) = 20+2+20 = 42 입니다.

예시 2 (부분완성 — 빈칸) — [2, 3] · [4, 1] = (2×4)+(3×1) = 8+3 = ___ 입니다. (답: 11)

예시 3 (독립적용 — 검색 엔진) — 검색 엔진은 "검색어 벡터 · 문서 벡터" 의 내적으로 관련도 점수를 매깁니다. 값이 클수록 검색 결과 위에 보여요.

a = np.array([5, 1, 4]); b = np.array([4, 2, 5])
print(np.dot(a, b))   # 42
print(a @ b)          # 42  (@ 도 같은 내적)

미니 시나리오 — LLM 의 어텐션(attention)이라는 핵심 기능이 바로 내적이에요. "이 단어가 저 단어에 얼마나 주목하나" 를 두 단어 벡터의 내적으로 계산합니다. 내적을 알면 어텐션도 그냥 곱하고 더하기예요.


4. 코사인 유사도 — 방향만 보기

막히는 장면

내적은 좋은데, 한 가지 문제가 있어요.

긴 문서일수록 숫자가 커서, 내용과 상관없이 내적이 무조건 커집니다.

길이 차이 때문에 짧은 문서가 늘 손해를 봐요.

그래서 길이를 빼고 방향(각도)만 비교하면 공정해집니다. 이게 코사인 유사도예요.

비유 먼저 — 같은 곳 보기

두 사람이 같은 방향을 보면 1, 직각(90도)이면 0, 정반대(180도)면 -1.

키가 크든 작든 상관없이, 보는 방향만 봅니다.

비유 코드 위험
같은 방향 보기 (각도) (a @ b) / (norm(a) * norm(b)) 0 이면 무관, 1 이면 매우 비슷
길이를 1로 맞춤 각 벡터를 자기 길이로 나눔 그냥 내적만 쓰면 긴 문서가 무조건 이김

한 문장 정의 — 코사인 유사도는 두 벡터의 각도만으로 비슷함을 재는 값(-1~1)이며, 크기는 무시하고 방향만 본다.

예시 폭격

예시 1 (완성예 — 같은 방향) — [1, 0][2, 0] 은 둘 다 오른쪽을 향해요(각도 0). 길이는 다르지만 방향이 같으니 코사인 = 1 입니다.

예시 2 (부분완성 — 빈칸) — [1, 0][0, 1] 은 하나는 오른쪽, 하나는 위쪽이라 직각(90도)이에요. 그래서 코사인 = ___ 입니다. (답: 0)

예시 3 (독립적용 — 음악 추천) — 스포티파이 "비슷한 곡" 은 곡마다 분위기 벡터를 만들어 코사인 유사도로 비교해요. 인기곡이든 신곡이든 분위기 방향이 같으면 추천됩니다.

from numpy.linalg import norm
a = np.array([5, 1, 4]); b = np.array([4, 2, 5])
print(round(a @ b / (norm(a) * norm(b)), 3))   # 0.949 (꽤 비슷)

미니 시나리오 — 0장에서 본 RAG(검색 증강 생성) 의 "내 질문과 가장 비슷한 문서 찾기" 가 바로 코사인 유사도예요. 벡터DB(Pinecone·Chroma) 가 수백만 문서 중 방향이 가장 가까운 것을 즉시 찾아 줍니다.


5. 행렬 곱 — 변환 기계

막히는 장면

"한국어 의미 벡터를 영어 의미 벡터로 바꿔라."

숫자를 하나하나 손으로 옮기면 끝이 없어요.

그런데 변환 규칙 전체를 행렬 하나에 적어 두고, 입력에 그 행렬을 곱하면 한 방에 바뀝니다. 이게 행렬 곱이에요.

비유 먼저 — 변환 기계

행렬 곱은 입력을 넣으면 모양이 바뀌어 나오는 기계예요.

기계(행렬)는 고정해 두고, 재료(입력 벡터)를 넣을 때마다 같은 변환이 적용됩니다.

비유 코드 위험
변환 기계 output = A @ B 답 1개에 행렬 곱이 수천 번 일어남
칸이 곧 다이얼(가중치) 가중치 행렬 = 파라미터 칸이 수천억 개 → GPU 없으면 너무 느림

한 문장 정의 — 행렬 곱은 행렬끼리 곱해 새 표로 변환하는 연산이며, 내적을 칸마다 여러 번 반복하는 것이다.

예시 폭격

예시 1 (완성예 — 한 칸만 보기) — [[1,2],[3,4]] × [[5,6],[7,8]] 의 맨 왼쪽 위 [0,0] 칸은, 첫째 줄 [1,2] 와 첫째 칸 [5,7] 의 내적이에요. (1×5)+(2×7) = 5+14 = 19 입니다.

예시 2 (부분완성 — 빈칸) — 같은 곱에서 [0,1] 칸은 첫째 줄 [1,2] 와 둘째 칸 [6,8] 의 내적이에요. (1×6)+(2×8) = 6+16 = ___ 입니다. (답: 22)

예시 3 (독립적용 — 신경망) — 신경망의 모든 층이 "입력 × 가중치 행렬" 이에요. 답변 1개에 행렬 곱이 수천 번 일어납니다. GPU 가 AI 에 필수인 이유가 바로 이 행렬 곱을 초고속으로 한꺼번에 하기 때문이에요.

A = np.array([[1, 2], [3, 4]]); B = np.array([[5, 6], [7, 8]])
print(A @ B)   # [[19 22] [43 50]]  ← 칸마다 행과 열의 내적

미니 시나리오 — 대형 모델이 "수천억 개 파라미터" 라는 말은, 곱셈에 쓰이는 행렬 칸이 수천억 개라는 뜻이에요. 0장 비유로는 라디오 다이얼 수천억 개를 조금씩 돌려 답을 맞춰 가는 셈입니다.


6. 고유값·고유벡터 — 안 변하는 화살표

막히는 장면

행렬은 보통 화살표를 늘리고 방향까지 비틀어요.

그런데 어떤 변환을 해도 방향이 안 바뀌는 특별한 화살표가 있습니다.

그 화살표가 고유벡터, 그때 늘어난 배율이 고유값이에요. 변환의 본질적 방향을 알려 줍니다.

비유 먼저 — 도는 지구본의 축

빙글 도는 지구본에서, 남극–북극 축만 자리를 안 바꿔요.

다른 점은 모두 돕니다. 그 축이 고유벡터예요. 변환의 중심 방향을 짚어 줍니다.

비유 코드 위험
지구본의 남극–북극 축 vals, _ = np.linalg.eig(A) 방향이 안 바뀌는 벡터만 고유벡터
늘어난 배율 = 고유값 [1,0][2,0] 이면 고유값 2 직관 없이 외우면 금방 헷갈림

한 문장 정의 — 고유벡터는 어떤 변환을 적용해도 방향이 안 바뀌는 특별한 화살표이고, 고유값은 그때 늘어난 배율이다.

예시 폭격

예시 1 (완성예) — [[2,0],[0,3]][1,0] 에 곱하면 [2,0] 이 됩니다. 방향은 그대로(오른쪽), 길이만 2배예요. 그래서 [1,0] 은 고유벡터, 2 는 고유값입니다.

예시 2 (부분완성 — 빈칸) — 같은 행렬 [[2,0],[0,3]][0,1] 에 곱하면 [0,3] 이에요. 방향(위쪽)은 그대로고 길이만 3배. 그래서 고유값은 ___ 입니다. (답: 3)

예시 3 (독립적용 — 페이지랭크) — 초창기 구글의 페이지랭크는 거대한 링크 행렬의 고유벡터를 계산하는 일이었어요. 데이터의 핵심 축을 뽑아내는 도구입니다.

A = np.array([[2, 0], [0, 3]])
vals, _ = np.linalg.eig(A)
print(vals)   # [2. 3.]  (고유값 두 개)

미니 시나리오 — 고유값·고유벡터는 데이터에서 가장 중요한 방향을 골라내 차원을 줄이는 일(PCA) 에 쓰여요. 회전 직관과도 닿아 있어, 이걸 알아 두면 나중에 임베딩을 분석할 때 훨씬 수월합니다.


정리 — 단순 규칙

이 장의 6가지는 따로따로가 아니라 한 줄로 이어져요.

도구 LLM 에서 하는 일
벡터 단어·문장의 의미를 숫자로 (임베딩)
행렬 문장 전체·모델 가중치
내적 단어 간 주목도 (어텐션 점수)
코사인 유사도 비슷한 문서 검색 (RAG·벡터DB)
행렬 곱 신경망 모든 층 (GPU 가속 대상)
고유값 핵심 축 뽑기 (차원 축소)

기억할 단순 규칙 세 줄 —

첫째, AI 가 다루는 모든 것은 결국 숫자 묶음(벡터·행렬)이다.

둘째, 비슷함은 글자가 아니라 방향(내적·코사인)으로 잰다.

셋째, 변환은 표 곱하기(행렬 곱) 한 방으로 끝낸다.

한 문장으로 — LLM 은 글자를 벡터로 바꾸고(임베딩), 행렬 곱으로 섞고, 내적으로 서로 주목하게(어텐션) 만드는 거대한 선형대수 계산기예요.

한 걸음 더 ▸ (지금 몰라도 됨) — 3차원까지는 우리가 그림으로 그릴 수 있지만, 컴퓨터는 768차원·4096차원도 똑같은 방식으로 다뤄요. "그림이 안 그려진다" 고 겁먹을 필요 없어요. 계산 규칙은 차원이 몇이든 똑같습니다. 더 깊이 보고 싶으면 3Blue1Brown 선형대수 시리즈(한국어 자막)와 Khan Academy Linear Algebra 가 강력 추천입니다.

다음 장 예고 — 다음 장에서는 "고칠 방향 찾기" 인 미적분으로 넘어가요. 모델이 틀렸을 때 어느 쪽으로 고쳐야 덜 틀리는지를 계산으로 찾습니다. (지금 몰라도 됩니다 — 다음 장에서 풀려요.)

난이도
에피소드
질문
카드를 로딩 중...
답변

클릭하거나 Space를 눌러 뒤집기

0 / 0
학습 진도 0%
이동   Space 뒤집기   R 셔플